/*
Copyright 2011 Francisco Nieto Raya

This program is free software: you can redistribute it and/or modify it under the terms of the Apache Software License 
as published by the Free Software Foundation, either version 2.0 of the License, or (at your option) any later version.

This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation.
For more information on the Apache Software Foundation, please see <http://www.apache.org/>.

*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "gd.h"
#include "imag.h"

/* Este programa realiza a una imagen un convoluciona vertical, otro 
   horizontal, un gradiente a partir de las imagenes resultantes 
   anteriores, una umbralización de la imagen resultante de gradiente,
   una normalización y, finalmente,la guarda en una imagen creada por
   el programa que recibe el nombre que ha sido pasado como parametro.
   Además, da opcion a guardar las imagenes resultantes de las funciones.
   Este recibe : el nombre del programa, el nombre de la imagen con la 
   que se trabaja, en la que se guarda el resultado y el umbral  */

int main(int argc,char *argv[]){
    int i,j,mh[3][3]={{-1,-2,-1},{0,0,0},{1,2,1}},mv[3][3]={{-1,0,1},{-2,0,2},{-1,0,1}},dev=0;
    gdImagePtr im;
    imagen* img,*Ih,*Iv,*Ig,*imgUmb,*imgh,*imgv;
    double num_umbral;
    if (argc<4){
       perror ("El formato es:\n nom programa %s nfichero1 %s nfichero2 %s umbral");
       exit (1);
    }
    num_umbral=atof(argv[3]);
    im=abrirImagen(argv[1]);
    img=deImagePtr(im);
    conv_gris (im,img);
    gdImageDestroy(im);
    imgh=conv_img(mh);
    Ih=convolucion(img,imgh);
    liberarImagen(imgh);
    for (j=4;(j<argc)&&(dev==0);j++){    
        if (!strcmp(argv[j],"-h")){
           im=deImagen(Ih);
           escribirImagen(argv[j+1],im);
           gdImageDestroy(im);
           dev=1;
           }
       }
    dev=0;
    imgv=conv_img(mv);
    Iv=convolucion(img,imgv);
    liberarImagen(imgv);
    liberarImagen(img);
    for (j=4;(j<argc)&&(dev==0);j++){    
        if (!strcmp(argv[j],"-v")){
           im=deImagen(Iv);
           escribirImagen(argv[j+1],im);
           gdImageDestroy(im);
           dev=1;
          }
          }
    dev=0;
    Ig=gradiente(Iv,Ih);
    for (j=4;(j<argc)&&(dev==0);j++){    
        if (!strcmp(argv[j],"-g")){
           im=deImagen(Ig);
           escribirImagen(argv[j+1],im);
           gdImageDestroy(im);
           dev=1;
           }
       }
    liberarImagen(Ih);
    liberarImagen(Iv);   
    imgUmb=umbral(Ig,num_umbral);
    liberarImagen(Ig);
    normaliza(imgUmb);
    im=deImagen(imgUmb);
    escribirImagen(argv[2],im);
    gdImageDestroy(im);
    liberarImagen(imgUmb);
    return 0;
}
